投資策略很少產生來自獨立同分布(IID)過程的報酬。在缺乏這一性質的情況下,策略報酬的序列經常出現連續盈利或虧損(Runs)。Runs是連續、相同正負號的報酬序列。因此,Runs增加了下行風險,這需要用適當的指標來評估。
IID
:獨立同分布,指一系列隨機變量既獨立又具有相同的機率分布。# 計算正報酬每個交易的集中度
rHHIPos = getHHI(ret[ret >= 0])
# 計算負報酬每個交易的集中度
rHHINeg = getHHI(ret[ret < 0])
# 按月計算交易集中度
tHHI = getHHI(ret.groupby(pd.TimeGrouper(freq='M')).count())
#————————————————————————————————————————
# getHHI函數
def getHHI(betRet):
# 如果betRet的形狀小於或等於2,返回nan
if betRet.shape[0] <= 2: return np.nan
# 計算權重
wght = betRet / betRet.sum()
# 計算hhi
hhi = (wght ** 2).sum()
# 計算最終的hhi值
hhi = (hhi - betRet.shape[0] ** -1) / (1. - betRet.shape[0] ** -1)
return hhi
直觀地說,最大回落(Drawdown, DD)是一次投資在兩個連續的最高資產水位標記(High-Water Marks, HWMs)之間所遭受的最大損失。最大回落時間(Time under Water, TuW)是從一個HWM到PnL超過之前最大PnL的時刻之間所流逝的時間。此段程式碼根據獲利百分比(dollars=False
)或者獲利絕對值(dollars=True
)推導出DD和TuW序列。
# 計算最大回落和與之相關的最大回落時間
def computeDD_TuW(series, dollars=False):
df0 = series.to_frame('pnl')
# 計算HWM(最高資產水位標記)
df0['hwm'] = series.expanding().max()
df1 = df0.groupby('hwm').min().reset_index()
df1.columns = ['hwm', 'min']
# 設置HWM發生的時間為索引
df1.index = df0['hwm'].drop_duplicates(keep='first').index
# 選擇那些在HWM之後有回落的行
df1 = df1[df1['hwm'] > df1['min']]
# 根據是使用百分比或絕對值計算DD
if dollars:
dd = df1['hwm'] - df1['min']
else:
dd = 1 - df1['min'] / df1['hwm']
# 計算最大回落時間,單位為年
tuw = ((df1.index[1:] - df1.index[:-1]) / np.timedelta64(1, 'Y')).values
tuw = pd.Series(tuw, index=df1.index[:-1])
return dd, tuw
一些有用的運行統計量包括:
getHHI(ret[ret >=0])
。getHHI(ret[ret < 0])
。getHHI(ret.groupby(pd.TimeGrouper(freq='M')).count())
。